/* 
 * File:   Nombre.cpp
 * Author: Gab'z
 * 
 * Created on 1 mai 2012, 19:45
 */

#include "Nombre.h"
#include "Complexe.h"
#include "NombreSimple.h"

Nombre::~Nombre() {
}

Nombre* add(const Nombre* c1, const Nombre* c2) {
    const Complexe* p_complexe1 = dynamic_cast<const Complexe*> (c1);
    const Complexe* p_complexe2 = dynamic_cast<const Complexe*> (c2);
    const NombreSimple* p_nbr1 = dynamic_cast<const NombreSimple*> (c1);
    const NombreSimple* p_nbr2 = dynamic_cast<const NombreSimple*> (c2);
    if (p_complexe1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_complexe1 + *p_complexe2);
        else if (p_nbr2 != 0) return new Complexe(*p_complexe1 + *p_nbr2);
        else std::cout << "add constsimple + constantesimple ECHEC";
    } else if (p_nbr1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_nbr1 + *p_complexe2);
        else if (p_nbr2 != 0) return add(p_nbr1, p_nbr2);
        else std::cout << "add constsimple + constantesimple ECHEC";
    }

    return 0;
    // throw std::exception("erreur addition *Constante Simple");
}

Nombre* sub(const Nombre* c1, const Nombre* c2) {
    const Complexe* p_complexe1 = dynamic_cast<const Complexe*> (c1);
    const Complexe* p_complexe2 = dynamic_cast<const Complexe*> (c2);
    const NombreSimple* p_nbr1 = dynamic_cast<const NombreSimple*> (c1);
    const NombreSimple* p_nbr2 = dynamic_cast<const NombreSimple*> (c2);
    if (p_complexe1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_complexe1 - *p_complexe2);
        else if (p_nbr2 != 0) return new Complexe(*p_complexe1 - *p_nbr2);
        else std::cout << "sub constsimple - constantesimple ECHEC";
    } else if (p_nbr1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_nbr1 - *p_complexe2);
        else if (p_nbr2 != 0) return sub(p_nbr1, p_nbr2);
        else std::cout << "sub constsimple - constantesimple ECHEC";
    }

    return 0;
    // throw std::exception("erreur soustraction *Constante Simple");
}

Nombre* mul(const Nombre* c1, const Nombre* c2) {
    const Complexe* p_complexe1 = dynamic_cast<const Complexe*> (c1);
    const Complexe* p_complexe2 = dynamic_cast<const Complexe*> (c2);
    const NombreSimple* p_nbr1 = dynamic_cast<const NombreSimple*> (c1);
    const NombreSimple* p_nbr2 = dynamic_cast<const NombreSimple*> (c2);
    if (p_complexe1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_complexe1 * *p_complexe2);
        else if (p_nbr2 != 0) return new Complexe(*p_complexe1 * *p_nbr2);
        else std::cout << "mul constsimple * constantesimple ECHEC";
    } else if (p_nbr1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_nbr1 * *p_complexe2);
        else if (p_nbr2 != 0) return mul(p_nbr1, p_nbr2);
        else std::cout << "mul constsimple * constantesimple ECHEC";
    }
    return 0;
    // throw std::exception("erreur multiplication *Constante Simple");
}

Nombre* div(const Nombre* c1, const Nombre* c2) {
    const Complexe* p_complexe1 = dynamic_cast<const Complexe*> (c1);
    const Complexe* p_complexe2 = dynamic_cast<const Complexe*> (c2);
    const NombreSimple* p_nbr1 = dynamic_cast<const NombreSimple*> (c1);
    const NombreSimple* p_nbr2 = dynamic_cast<const NombreSimple*> (c2);
    if (p_complexe1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_complexe1 / *p_complexe2);
        else if (p_nbr2 != 0) return new Complexe(*p_complexe1 / *p_nbr2);
        else std::cout << "div constsimple / constantesimple ECHEC";
    } else if (p_nbr1 != 0) {
        if (p_complexe2 != 0) return new Complexe(*p_nbr1 / *p_complexe2);
        else if (p_nbr2 != 0) return div(p_nbr1, p_nbr2);
        else std::cout << "div constsimple / constantesimple ECHEC";
    }
    return 0;
    // throw std::exception("erreur division *Constante Simple");
}